package componentes.basicos;

/**
 * Classe que representa uma palavra.
 * Uma palavra é normalmente representada por um conjunto de 32 bits.
 * 
 * @author Gustavo Miguel, Cleisson Alves, Evandro Francisco, Lucas.
 */
public class Palavra {
    
    // Atributo da classe
    private String palavra;
    
    /**
     * Construtor que inicializa uma palavra como Inoperante.
     * Uma palavra inoperante contém todos os seus bits iguais a Zero.
     */
    public Palavra() {
        palavra = Constantes.INOPERANTE.getPalavra();
    }
    
    /**
     * Cria uma Palavra a partir de uma sequencia de caracteres.
     * @param palavra Sequencia de bits da palavra.
     */
    public Palavra(String palavra) {
        this.palavra = palavra;
        int limite = 32 - palavra.length();
        for(int i = 0; i < limite; ++i) {
            this.palavra = "0".concat(this.palavra);
        }
    }
    
    /**
     * Cria uma palavra a partir de um valor decimal informado.
     * @param valorDecimal Valor decimal.
     */
    public Palavra(int valorDecimal) {
        this.palavra = Integer.toBinaryString(valorDecimal);
        int limite = 32 - palavra.length();
        for(int i = 0; i < limite; ++i) {
            this.palavra = "0".concat(this.palavra);
        }
    }
    
    /**
     * Método que verifica se duas palavras são iguais. Duas
     * palavras são iguais se suas sequência de bits são iguais.
     * @param p Palavra a ser comparada
     * @return True se são iguais, false caso contrário.
     */
    public boolean palavrasSaoIguais(Palavra p) {
        
        if(palavra.equals(p.getPalavra())) 
            return true;
        else
            return false;
        
    }
    
    /**
     * Verifica se os bits contidos em uma palavra são formados por bits 0s e 1s.
     * @return true se os bits são 0s e 1s, false caso contrário.
     */
    public boolean verificaPalavra() {
        return palavra.replaceAll("[01]", "").equals("");
    }
    
    /**
     * Método para retornar o tamanho da Palavra.
     * @return Tamanho da palavra.
     */
    public int tamanhoPalavra() {
        return palavra.length();
    }
    
    /**
     * Retorna a sequencia de bits que constituem uma palavra.
     * @return String com a sequencia de bits da palavra.
     */
    public String getPalavra() {
        return palavra;
    }

    /**
     * Confiura a palavra a partir de uma sequencia de bits especificada.
     * @param palavra Sequencia de bits especificada.
     */
    public void setPalavra(String palavra) {
        this.palavra = palavra;
    }    
    
} // Fim da classe.
